package com.arpa.wms.service;

import com.arpa.core.web.Result;
import com.arpa.ntocc.common.common.util.UserUtil;
import com.arpa.wms.domain.dto.DeliveryItemDTO;
import com.arpa.wms.domain.entity.DeliveryItem;
import com.arpa.wms.domain.vo.DeliveryItemVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 出货单明细 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface IDeliveryItemService extends IService<DeliveryItem> {

    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    boolean save(DeliveryItem entity);

    /**
     * 根据code更新实体
     * @param entity
     * @return
     */
    int updateByCode(DeliveryItem entity);

    /**
     * 查询列表
     * @param deliveryItemDTO
     * @return
     */
    List<DeliveryItemVO> queryList(DeliveryItemDTO deliveryItemDTO);

    /**
     * 查询合计,包含总数
     * @param deliveryItemDTO
     * @return
     */
    DeliveryItemVO queryListSum(DeliveryItemDTO deliveryItemDTO);

     /**
      *  @author: Allen chen
      *  @Date: 2020/8/20 13:35
      *  @Description: 根据出货单明细code查询
      */
    List<DeliveryItemVO> queryListByItemCode(DeliveryItem item);



    /**
     * 拣货确认时，根据拣货单明细信息更新订单明细拣货数量
     * @param pickingItemCode
     * @param pickingQuantity
     * @return
     */
    int updatePickingQuantity(String pickingItemCode, BigDecimal pickingQuantity);

    /**
     * 获取可退商品明细
     * @param deliveryCode
     * @return
     */
    List<DeliveryItemVO> findCanRefundItems(String deliveryCode);

    /**
     * 退货单提交时，更新可退商品数量
     * @param deliveryItemDTO
     */
    Result updateRefundQuantity(DeliveryItemDTO deliveryItemDTO);

    /**
     * 根据发货单号、状态，更新发货单明细状态
     * @param deliveryCode
     * @param status
     * @return
     */
    int updateStatusByDeliveryCode(String deliveryCode, String status);

    int adjustDistributionQuantity(DeliveryItemDTO deliveryItemDTO);

    /***
     * @description
     * 拣货单确认时，根据订单号，更新订单明细中的拣货数量
     * @author xuyang
     * @date 2020/10/23 14:11
     * @param deliveryCode:
     **/
    int updatePickingQuantityForCheck(String deliveryCode,String groupCode);

    /**
     * 根据收货单明细更新订单明细的退货数量
     * @param deliveryCode
     * @return
     */
    int updateRefundQuantityByReceiveItem(String deliveryCode);

    /**
     * 根据取消退货，更新订单明细的退货数量
     * @param deliveryItemCode
     * @param cancelQuantity
     * @return
     */
    boolean updateRefundQuantityByReceiveCancel(String deliveryItemCode, BigDecimal cancelQuantity);

    /**
     * @description
     *
     * @author xuyang
     * @date 2020/12/16 9:01
     * @param itemDTO:
     **/
    List<DeliveryItemVO> queryRefundList(DeliveryItemDTO itemDTO);

    /**
     * 出库复核时调整分配数量，如缺货登记后
     * @param keySet
     */
    int updateDistributionQuantityForOutboundRecheck(Set<String> keySet);

    /**
     * 根据波次号更新发货明细的出库数量
     * @param wavePickingCode
     * @return
     */
    int updateOutboundQuantityByWavePickingCode(String wavePickingCode);

    /**
     * 根据波次号更新发货明细的拣货数量
     * @param wavePickingCode
     * @param status
     * @return
     */
    int updatePickingQuantityStatusByWavePickingCode(String wavePickingCode, String status,String groupCode);

    /**
     * 根据订单Code以分组的方式查询订单详情信息
     * @param deliveryCodes
     * @return
     */
    List<Map<String,Object>> getDeliveryItemList(List<String> deliveryCodes);

    /**
     * 根据订单明细code查询订单信息
     * @param deliveryCode
     * @param goodsBarCode
     * @return
     */
    DeliveryItemVO getDeliveryItemByBarCode(String deliveryCode, String goodsBarCode,String groupCode);

    /**
     * @description
     * 根据拣货量与复核量+退减量的比较，尝试更新明细的状态
     * @author xuyang
     * @date 2020/10/29 8:55
     * @param itemCode:
     * @param status:
     **/
    int updateStatusIfFinishRecheck(String itemCode, String status);

    /**
     * 根据订单号更新发货明细的复核数量
     * @param deliveryCode
     * @return
     */
    int updateRecheckQuantity(String deliveryCode,String groupCode,boolean updateNotRecheckQuantity);

    /**
     * @description
     * 根据波次号，更新复合数量和状态
     * @author rfwang
     * @date 2021年7月16日
     * @param wavePickingCode:
     **/
    int updateRecheckQuantityAndStatsuByWavePickingCode(String wavePickingCode,String groupCode);

    /**
     * 插叙汇总的分配数量
     * @param deliveryItemDTO
     * @return
     */
    List<DeliveryItemVO> querySumDistributionQuantity(DeliveryItemDTO deliveryItemDTO);


}
